package org.whh.automatic.model;

import java.awt.*;
import java.io.Serializable;

/**
 * 操作步骤模型类
 * <p>
 * 该类表示自动化操作中的一个具体步骤，支持以下三种操作类型：
 * 1. 快捷键操作：使用键盘快捷键执行操作
 * 2. 坐标点击操作：在指定屏幕坐标位置执行鼠标点击
 * 3. 复制粘贴操作：执行文本的复制粘贴，支持固定值和动态值
 * <p>
 * 每个步骤都可以配置执行后的等待时间，以确保操作的稳定性。
 * 该类实现了Serializable接口，支持对象的序列化和反序列化。
 */
public class Step implements Serializable {

    /**
     * 序列化版本号
     */
    private static final long serialVersionUID = 1L;
    /**
     * 步骤名称
     * 用于标识和描述当前步骤的作用
     */
    private String name;
    /**
     * 操作类型
     * 默认为快捷键操作(SHORTCUT)
     */
    private ActionType actionType = ActionType.SHORTCUT;
    /**
     * 快捷键组合
     * 当操作类型为SHORTCUT时使用，存储快捷键组合字符串
     */
    private String shortcut;
    /**
     * 点击坐标
     * 当操作类型为COORDINATE时使用，存储要点击的屏幕坐标
     */
    private Point coordinate;
    /**
     * 点击类型
     * 当操作类型为COORDINATE时使用，默认为单击
     */
    private ClickType clickType = ClickType.SINGLE;
    /**
     * 是否为复制粘贴操作的标志
     * 当操作类型为PASTE时为true
     */
    private boolean isPaste = false;
    /**
     * 粘贴值类型
     * 当isPaste为true时使用，默认为固定值类型
     */
    private PasteValueType pasteValueType = PasteValueType.FIXED;
    /**
     * 粘贴的固定值
     * 当pasteValueType为FIXED时使用的文本内容
     */
    private String pasteFixedValue;
    /**
     * 粘贴的动态值名称
     * 当pasteValueType为DYNAMIC时使用，用于标识动态值的来源
     */
    private String pasteDynamicName;
    /**
     * 执行后等待时间（秒）
     * 步骤执行完成后的等待时间，默认为1秒，确保操作的稳定性
     */
    private int waitTime = 1;

    /**
     * 默认构造函数
     */
    public Step() {
    }

    /**
     * 使用步骤名称构造对象
     *
     * @param name 步骤名称
     */
    public Step(String name) {
        this.name = name;
    }

    /**
     * 构造快捷键操作步骤
     *
     * @param name     步骤名称
     * @param shortcut 快捷键组合
     * @param waitTime 等待时间（秒）
     */
    public Step(String name, String shortcut, int waitTime) {
        this.name = name;
        this.shortcut = shortcut;
        this.actionType = ActionType.SHORTCUT;
        this.waitTime = waitTime > 0 ? waitTime : 1;
    }

    /**
     * 构造坐标点击操作步骤
     *
     * @param name       步骤名称
     * @param coordinate 点击坐标
     * @param waitTime   等待时间（秒）
     */
    public Step(String name, Point coordinate, int waitTime) {
        this.name = name;
        this.coordinate = coordinate;
        this.actionType = ActionType.COORDINATE;
        this.waitTime = waitTime > 0 ? waitTime : 1;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ActionType getActionType() {
        return actionType;
    }

    // Getter和Setter方法

    public void setActionType(ActionType actionType) {
        this.actionType = actionType;
    }

    public String getShortcut() {
        return shortcut;
    }

    /**
     * 设置快捷键，同时更新操作类型
     *
     * @param shortcut 快捷键组合
     */
    public void setShortcut(String shortcut) {
        if (shortcut != null && !shortcut.isEmpty()) {
            this.shortcut = shortcut;
            this.actionType = ActionType.SHORTCUT;
            this.isPaste = false;
        }
    }

    public Point getCoordinate() {
        return coordinate;
    }

    /**
     * 设置点击坐标，同时更新操作类型
     *
     * @param coordinate 点击坐标
     */
    public void setCoordinate(Point coordinate) {
        if (coordinate != null) {
            this.coordinate = coordinate;
            this.actionType = ActionType.COORDINATE;
            this.isPaste = false;
        }
    }

    public ClickType getClickType() {
        return clickType;
    }

    public void setClickType(ClickType clickType) {
        this.clickType = clickType;
    }

    /**
     * 判断是否为双击操作
     *
     * @return 如果是双击返回true，否则返回false
     */
    public boolean isDoubleClick() {
        return clickType == ClickType.DOUBLE;
    }

    public int getWaitTime() {
        return waitTime;
    }

    /**
     * 设置等待时间，确保至少为1秒
     *
     * @param waitTime 等待时间（秒）
     */
    public void setWaitTime(int waitTime) {
        this.waitTime = waitTime > 0 ? waitTime : 1;
    }

    public boolean isPaste() {
        return isPaste;
    }

    /**
     * 设置是否为粘贴操作，同时更新操作类型
     *
     * @param isPaste 是否为粘贴操作
     */
    public void setPaste(boolean isPaste) {
        this.isPaste = isPaste;
        if (isPaste) {
            this.actionType = ActionType.PASTE;
        }
    }

    public PasteValueType getPasteValueType() {
        return pasteValueType;
    }

    public void setPasteValueType(PasteValueType pasteValueType) {
        this.pasteValueType = pasteValueType;
    }

    public String getPasteFixedValue() {
        return pasteFixedValue;
    }

    /**
     * 设置固定粘贴值，同时更新相关状态
     *
     * @param pasteFixedValue 要粘贴的固定文本值
     */
    public void setPasteFixedValue(String pasteFixedValue) {
        this.pasteFixedValue = pasteFixedValue;
        if (pasteFixedValue != null && !pasteFixedValue.isEmpty()) {
            this.isPaste = true;
            this.actionType = ActionType.PASTE;
            this.pasteValueType = PasteValueType.FIXED;
        }
    }

    public String getPasteDynamicName() {
        return pasteDynamicName;
    }

    /**
     * 设置动态粘贴值名称，同时更新相关状态
     *
     * @param pasteDynamicName 动态值的标识名称
     */
    public void setPasteDynamicName(String pasteDynamicName) {
        this.pasteDynamicName = pasteDynamicName;
        if (pasteDynamicName != null && !pasteDynamicName.isEmpty()) {
            this.isPaste = true;
            this.actionType = ActionType.PASTE;
            this.pasteValueType = PasteValueType.DYNAMIC;
        }
    }

    /**
     * 检查是否配置了有效的快捷键
     *
     * @return 如果配置了有效的快捷键返回true，否则返回false
     */
    public boolean hasShortcut() {
        return actionType == ActionType.SHORTCUT && shortcut != null && !shortcut.isEmpty();
    }

    /**
     * 检查是否需要动态值
     *
     * @return 如果是动态值粘贴操作且配置了动态值名称返回true，否则返回false
     */
    public boolean needsDynamicValue() {
        return isPaste && pasteValueType == PasteValueType.DYNAMIC &&
                pasteDynamicName != null && !pasteDynamicName.isEmpty();
    }

    /**
     * 步骤操作类型枚举
     * <p>
     * 定义了三种基本的操作类型：
     * - SHORTCUT：使用键盘快捷键执行操作
     * - COORDINATE：使用鼠标在特定坐标位置点击
     * - PASTE：执行文本复制粘贴操作
     */
    public enum ActionType {
        /**
         * 使用快捷键操作
         */
        SHORTCUT,
        /**
         * 使用坐标点击操作
         */
        COORDINATE,
        /**
         * 复制粘贴操作
         */
        PASTE
    }

    /**
     * 粘贴值类型枚举
     * <p>
     * 定义了两种粘贴值的类型：
     * - FIXED：使用预设的固定文本值
     * - DYNAMIC：使用运行时动态获取的文本值
     */
    public enum PasteValueType {
        /**
         * 固定值类型
         */
        FIXED,
        /**
         * 动态值类型
         */
        DYNAMIC
    }

    /**
     * 点击类型枚举
     * <p>
     * 定义了两种鼠标点击类型：
     * - SINGLE：单击操作
     * - DOUBLE：双击操作
     */
    public enum ClickType {
        /**
         * 单击操作
         */
        SINGLE,
        /**
         * 双击操作
         */
        DOUBLE
    }
}
